STM32CubeMX

您所在的位置:网站首页 stm32 pwm输入 占空比 STM32CubeMX

STM32CubeMX

#STM32CubeMX | 来源: 网络整理| 查看: 265

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期

目录STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期1、介绍2、STM32CubeMX配置2.1 基本配置2.2 PWM输出配置2.3 PWM输入捕获配置3、程序修改和测试

本篇博客以STM32F103C8为例,其他系列MCU可能稍有不同,但原理一样。

相关链接博文:

STM32CubeMX | STM32使用HAL库实现定时器PWM输出STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量1、介绍

以前写过一篇博文,介绍的是如何使用定时器的输入捕获功能测量脉冲的宽度以及周期,适合测量某个脉冲或者测量按键按下时候的保持时间(见上面链接博客),不适合测量连续输出的脉冲场景。

STM32的定时器还存在一个PWM输入模式,只要将未知PWM波接入到定时器输入模式的引脚上,会自动算出占空比和周期,相当于示波器探针了。

2、STM32CubeMX配置2.1 基本配置

使用的是STM32F103C8,时钟配置到72M主频:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期_脉冲宽度测量

使能串口1,用于调试打印:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期_单片机_02

2.2 PWM输出配置

想要测试PWM输入功能对不对,那么首先要让定时器生成一路用于测试的PWM脉冲,这里我利用TIM4的通道2输出一个10KHz、占空比50%的PWM波,PWM输出到PB6引脚上:

定时器分频系数设置为72,72MHz/72=1MHz的计数频率,重载值设置为100,则1MHz/100=10KHz的计数频率。

因为将重载设置为了100,设置脉冲0~100的范围就正好是占空比0%至100%。

Pulse设置的是有效电平的时间,

将Pulse设置为50,有效时间正好占用一半,此时的占空时间也就是50,占空比就为50/100=0.5=50%

如果将脉冲设置为80,那么有效时间是80,占空时间就是20,占空比就为20/100=0.2=20%

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期_脉冲宽度测量_03

2.3 PWM输入捕获配置

将TIM2配置为PWM输入模式,我是使用的PWM输入通道2,也就是PA1引脚。

PWM输入模式开启后,会使用到通道一和通道2,一路用于捕获上升沿、一路用于捕获下降沿,这里要注意!

设置为72分频得到1MHz的计数频率,TIM2计一个数就是1us,这样设置比较好计算。

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期_PWM输入_04

使能TIM2的全局中断:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期_stm32_05

生成代码即可~!

3、程序修改和测试uint32_t uiDutyCycle; uint32_t uiCycle; uint32_t uiFrequency; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == htim2.Instance) { switch(htim->Channel) { case HAL_TIM_ACTIVE_CHANNEL_1: uiDutyCycle = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); /* 占空比 */ break; case HAL_TIM_ACTIVE_CHANNEL_2: uiCycle = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); /* 周期 */ break; default:break; } } } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); MX_USART1_UART_Init(); MX_TIM4_Init(); HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); /* 使能定时器4通道1输出PWM波 */ HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); /* 使能定时器2通道1的PWM输入捕获 */ HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); /* 使能定时器2通道2的PWM输入捕获 */ while(1) { HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_Delay(500); uiFrequency = 1000000 / uiCycle; printf("占空:%dus 周期:%dus 频率:%dHz \r\n", uiDutyCycle, uiCycle, uiFrequency); } } int fputc(int ch, FILE* fp) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); return ch; }

先用示波器接到PB6引脚上,看看TIM4输出的10KHz对不对:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期_单片机_06

验证后没问题,然后将PB6接到PA1引脚上。

再看串口输出的测量结果:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期_PWM输入_07

基本准确,但是存在误差!

在程序中将脉冲改为80,那么此时的PWM波,一个周期内的高电平时间是80,低电平时间是20,则占空比就是20%:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期_脉冲宽度测量_08

在看输出结果:

STM32CubeMX | 使用STM32定时器的PWM输入模式测量脉冲宽度和周期_stm32_09

没问题,捕获的正确~!

ends…



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3